package com.sharer.last.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.*;
import com.sharer.last.support.CommonFieldFillHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * mybatis plus 配置
 *
 * @ClassName MybatisPlusConfiguration
 * @Author WangJin
 * @Date 2023/04/28/9:39
 * @Description
 * @Version 1.0
 */
@Configuration
@MapperScan("com.sharer.last.mapper.**")
public class MybatisPlusConfiguration {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 自动分页 PaginationInnerInterceptor
        interceptor.addInnerInterceptor(paginationInnerInterceptor());
        // 乐观锁 OptimisticLockerInnerInterceptor
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 防止全表更新与删除 BlockAttackInnerInterceptor
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());

        // sql性能规范 IllegalSQLInnerInterceptor
        // 动态表名 DynamicTableNameInnerInterceptor
        // 多租户 TenantLineInnerInterceptor
        // 数据权限 DataPermissionInterceptor
        return interceptor;
    }

    /**
     * <h3>分页插件</h3>
     * <p>setMaxLimit： 设置最大分页数<br/>
     * setOverflow：是否对超过最大分页时做溢出处理，默认false不处理，即直接丢弃溢出的数据，为true时，怎么把溢出数据放入到下一个分页中。<br/>
     * setDbType：设置数据库类型以匹配不同方言<br/>
     * setDialect： 设置分页方言<br/>
     * setOptimizeJoin：优化Join分页语句，默认true</p>
     *
     * @return
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置最大分页数
        paginationInnerInterceptor.setMaxLimit(100L);
        // 是否对超过最大分页时做溢出处理
        paginationInnerInterceptor.setOverflow(true);
        // 设置数据库类型
        paginationInnerInterceptor.setDbType(DbType.MYSQL);

        return paginationInnerInterceptor;
    }

    /**
     * 配置公共字段自动填写
     *
     * @return
     */
    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new CommonFieldFillHandler();
    }
}
